/**
 * @(#)ISystemPorcessDefinitionService.java Aug 31, 2009
 *   
 * Copyright  (c) 2009-2010 Wilmar IT Service,  Inc.   
 * All  rights  reserved.   
 * TODO
 */

package com.wilmar.process.core.services.api;

import java.io.File;
import java.io.InputStream;
import java.util.List;

import org.jbpm.api.ProcessDefinition;

import com.wilmar.common.util.PageinationEntity;
import com.wilmar.process.entity.ProcessReleaseNotes;
import com.wilmar.process.entity.User;
import com.wilmar.process.entity.query.ProcessDefinitionQueryObject;
import com.wilmar.process.entity.vo.ProcessDefinitionVO;
import com.wilmar.process.exception.DirtyDataException;
import com.wilmar.process.exception.ObjectNotFoundException;

/**
 * @author MaKuBEX Email:makubexnet@gmail.com
 * @version 1.0.0
 */
public interface ISystemProcessDefinitionService extends
		IBaseService<ProcessDefinitionVO, ProcessDefinition> {
	/**
	 * 部署一个流程定义
	 * 
	 * @param definitionPackage
	 *            流程定义文件所在的压缩包
	 * @param processReleaseNotes
	 *            流程发布说明
	 */
	public void deployProcessDefinition(File definitionPackage,
			ProcessReleaseNotes processReleaseNotes);

	/**
	 * 部署一个流程定义
	 * 
	 * @param definitionString
	 *            流程定义内容字符串
	 * @param processReleaseNotes
	 *            流程发布说明
	 */
	public void deployProcessDefinition(String definitionString,
			ProcessReleaseNotes processReleaseNotes);

	/**
	 * 获取全部最新版本的流程定义
	 * 
	 * @param page
	 *            分页信息
	 * 
	 * @return 流程定义列表
	 */
	public List<ProcessDefinition> getListAllWithLastestVersion(
			PageinationEntity page);

	/**
	 * 根据提供的用户，角色以及机构信息，获取被授权的流程定义列表
	 * 
	 * @param user
	 *            用户信息
	 * @param prototype
	 *            查询条件以及分页信息
	 * @return 流程定义列表
	 * @throws DirtyDataException
	 *             当权限信息有脏数据时
	 */
	public List<ProcessDefinition> getListAllWithLastestVersion(User user,
			ProcessDefinitionQueryObject prototype) throws DirtyDataException;

	/**
	 * 根据流程定义名称删除对应的全部版本的流程定义
	 * 
	 * @param processDefinitionKey
	 *            流程定义名称
	 */
	public void removeAllVersionOfProcessDefinitionByKey(
			String processDefinitionKey);

	/**
	 * 根据流程名称删除流程定义的最新版本
	 * 
	 * @param processDefinitionKey
	 *            流程定义名称
	 */
	public void removeLastestVersionOfProcessDefinitionByKey(
			String processDefinitionKey);

	/**
	 * 根据流程流程部署id删除流程定义
	 * 
	 * @param processDefinitionId
	 *            流程定义编号
	 * @param processDeploymentId
	 *            流程部署id
	 */
	public void removeProcessDefinitionById(String processDefinitionId,
			String processDeploymentId);

	/**
	 * 根据流程定义编号删除该流程对应的所有实例，历史
	 * 
	 * @param processDefinitionId
	 *            流程定义编号
	 */
	public void removeAllInfoProcessDefinitionById(String processDefinitionId);

	/**
	 * 根据流程定义编号获取该流程的提报表单标识
	 * 
	 * @param processDefinitionId
	 *            流程定义编号
	 * @return 流程表单标识
	 * @throws ObjectNotFoundException
	 *             当提供的流程定义编号并没有对应的流程信息
	 */
	public String getStartFormByProcessDefinitionId(String processDefinitionId)
			throws ObjectNotFoundException;

	/**
	 * 根据流程定义Key获取该流程最新版本的提报表单
	 * 
	 * @param processDefinitionKey
	 *            流程定义Key
	 * @return 流程最新版本的提报表单标识
	 * @throws ObjectNotFoundException
	 *             当提供的流程定义编号并没有对应的流程信息
	 */
	public String getStartFormByProcessDefinitionKey(String processDefinitionKey)
			throws ObjectNotFoundException;

	/**
	 * 根据流程定义编号获取流程定义的图片输入流
	 * 
	 * @param definitionId
	 *            流程定义编号
	 * @return 流程定义图片的输入流
	 * @throws ObjectNotFoundException
	 *             如果该流程定义发布时并没有附属图片，或者没有该流程定义
	 */
	public InputStream getDefinitionImageById(String definitionId)
			throws ObjectNotFoundException;

	/**
	 * 根据流程定义获取流程描述
	 * 
	 * @param processDefinitionId
	 *            流程定义编号
	 * @return 流程定义描述
	 * @throws ObjectNotFoundException
	 *             流程定义不存在
	 */
	public String getProcessDescriptionById(String processDefinitionId)
			throws ObjectNotFoundException;
}
